var table_page = new Array();

// FUNCIONES TABLAS ASOCIADA
function showAddRowTable(model, plugin, row) {
    var box = $("div[id='table_add["+model+"]']");
    
    // Si ya estaba visible la tabla para agregar filas la oculto
    if (box.css("display") != "none") {
        hideAddRowTable(model);
        return;
    }
    
    if (empty(row)) {
        box.find("a.continuar").unbind("click").click(function() {
            addRowTable(model, plugin);
        } );
    }
    else {
        box.find("a.continuar").unbind("click").click(function() {
            saveRowTable(model, row, plugin);
        });
    }
    
    box.show(200);
    $.scrollTo($("div[id='table_add[" + model + "]']"),800, {queue:true});
}

function hideAddRowTable(model) {
    $("div[id='table_add["+model+"]']").hide(200);
    resetFieldsAddTable(model);
}

function getFieldsAjax(model, value, plugin) {
    var data;
    if (!empty(plugin)) {
        plugin = plugin.toLowerCase() + '/';
    }
    
    $.ajax({
        type: "POST",
        url: WWW + plugin + model.toLowerCase() + 's/ajaxID/' + value,
        dataType: 'json',
        async: false,
        success: function(json){
            data=json;
        }
    });
    return data;
}

function checkRowTable(model, assoc) {
    if (assoc) {
        var rules = [['pk', [['El '+model+' es requerido', 'notEmpty']]]];
        return validateForm(model, rules, true);
    }
    if (!empty(table_rules[model])) {
        return validateForm(model, table_rules[model], true);
    }
    return true;
}

function addRowTable(model, plugin) {   
    if (empty(table_fields[model])) {
        console.log("ERROR (addRowTable) NO ESTA SETEADO EL ARRAY DE CAMPOS PARA LA TABLA ASOCIADA DEL MODELO " + model);
        return;
    }
    
    try {
        var cant = parseInt($("table[id='table["+model+"]'] tr:last td.number").text());
        var next = (empty(cant) ? 1 : cant+1);
        var html = '';
        var pk = $("[name='data["+model+"][pk]']");
        var assoc = $("[id='table["+model+"][assoc]']").val() == 1;
                
        // Valida los campos obligatorios de la tabla
        if (!checkRowTable(model, assoc)) {
            return;
        }
                
        // Si es un muchos a muchos hace validaciones especiales
        if (assoc) {
            // Si elije una opcion ya ingresada tira un error
            if (!empty(pk)) {
                var respPK = PKadded(model, pk.val());
                if (respPK == 1) {
                    $("#dialog-modal-errores").html("<div class='form-error-header'>Por favor corrija estos errores:</div> <div class='form-error'><strong>»</strong> El registro seleccionado ya se encuentra ingresado.</div>");
                    $("#dialog-modal-errores").data("kendoWindow").center().open();
                    return;
                }
                // Si estaba borrado el registro no muestro el error
                else if (respPK == 2) {
                    hideAddRowTable(model);
                    return;
                }
            }
        }
    
        html+= '<tr id="table_row['+model+']['+next+']">';
        html+= '<td class="number">';
        html+= '<input type="hidden" name="table['+model+']['+next+'][do]" id="table['+model+']['+next+'][do]" value="A" />';
        
        // Si es muchos a muchos toma los campos a mostrar por ajax y ya setea la PK
        if (assoc) {
            var pk_data = getFieldsAjax(model, pk.val(), plugin);
            html+= '<input type="hidden" name="table['+model+']['+next+'][pk]" id="table['+model+']['+next+'][pk]" value="'+pk.val()+'" />';
        }
        
        html+= next;
        html+= '</td>';
        for (var i in table_fields[model]) {
            var field = table_fields[model][i]["name"];
            if (assoc) {
                var description = pk_data[model][field];
                var value = description;
            }
            else {
                var obj = $("[id='table_add["+model+"]["+field+"]']");
                var description = getFieldDescription(obj);
                var value = obj.val();
            }
            html+= '<td>';
            html+= description;
            html+= '<input type="hidden" name="table['+model+']['+next+']['+field+']" id="table['+model+']['+next+']['+field+']" value="'+value+'" />';
            html+= '</td>';
        }
        html+= '<td class="acciones">';
        html+= '<a href="javascript:;" onclick="editRowTable(\''+model+'\', \''+plugin+'\', '+next+');"><img src="'+WWW+'img/edit.gif" alt="Editar"></a> ';
        html+= '<a href="javascript:;" onclick="deleteRowTable(\''+model+'\', \''+plugin+'\', '+next+');"><img src="'+WWW+'img/delete.png" alt="Eliminar"></a>';
        html+= '</td>';
        html+= '</tr>';
    
        $("table[id='table["+model+"]'] tbody").append(html);
        hideAddRowTable(model);
    }
    catch(err) {
        console.log("ERROR (addRowTable) " + err.message);
    }
}

function saveRowTable(model, row, plugin) {   
    if (empty(table_fields[model])) {
        console.log("ERROR (saveRowTable) NO ESTA SETEADO EL ARRAY DE CAMPOS PARA LA TABLA ASOCIADA DEL MODELO " + model);
        return;
    }
    
    try {
        if (!checkRowTable(model)) {
            return;
        }
        
        var obj_row = $("tbody tr[id='table_row["+model+"]["+row+"]']")
        var html = '';
        var assoc = $("[id='table["+model+"][assoc]']").val() == 1;
    
        // Si es un muchos a muchos hace validaciones especiales
        if (assoc) {
            var pk = $("[id='table_add["+model+"][pk]']");
            var old_pk = obj_row.find("[id$='[pk]']")
            
            // Si es muchos a muchos y elije la misma opcion no se hace nada
            if (old_pk.val()==pk.val()) {
                hideAddRowTable(model);
                return;
            }
    
            // Si elije una opcion ya ingresada tira un error
            if (!empty(pk)) {
                var respPK = PKadded(model, pk.val());
                if (respPK == 1) {
                    $("#dialog-modal-errores").html("<div class='form-error-header'>Por favor corrija estos errores:</div> <div class='form-error'><strong>»</strong> El registro seleccionado ya se encuentra ingresado.</div>");
                    $("#dialog-modal-errores").data("kendoWindow").center().open();
                    return;
                }
                // Si estaba borrado el registro no muestro el error
                else if (respPK == 2) {
                    return;
                }
            } 
        }
        else {
            var pk = $("[id='table["+model+"]["+row+"][pk]']");
        }
    
        // Si edita una fila que todavia no se inserto en la db la accion sigue siendo A
        if (getRowDo(model, row) == "A") {
            var do_action = "A";
        }
        else {
            var do_action = "E";
        }
    
        html+= '<td class="number">';
        html+= '<input type="hidden" name="table['+model+']['+row+'][do]" id="table['+model+']['+row+'][do]" value="'+do_action+'" />';
        if (assoc) {
            if (do_action == "E") {
                html+= '<input type="hidden" name="table['+model+']['+row+'][old_pk]" id="table['+model+']['+row+'][old_pk]" value="'+old_pk.val()+'" />';
            }
            var pk_data = getFieldsAjax(model, pk.val(), plugin);
        }
        html+= '<input type="hidden" name="table['+model+']['+row+'][pk]" id="table['+model+']['+row+'][pk]" value="'+pk.val()+'" />';
        html+= row;
        html+= '</td>';
        for (var i in table_fields[model]) {
            var field = table_fields[model][i]["name"];
            if (assoc) {
                var description = pk_data[model][field];
                var value = description;
            }
            else {
                var obj = $("[id='table_add["+model+"]["+field+"]']");
                var description = getFieldDescription(obj);
                var value = obj.val();
            }
            html+= '<td>';
            html+= description;
            html+= '<input type="hidden" name="table['+model+']['+row+']['+field+']" id="table['+model+']['+row+']['+field+']" value="'+value+'" />';
            html+= '</td>';
        }
        html+= '<td>';
        html+= '<a href="javascript:;" onclick="editRowTable(\''+model+'\', \''+plugin+'\', '+row+');"><img src="'+WWW+'img/edit.gif" alt="Editar"></a> ';
        html+= '<a href="javascript:;" onclick="deleteRowTable(\''+model+'\', \''+plugin+'\', '+row+');"><img src="'+WWW+'img/delete.png" alt="Eliminar"></a>';
        html+= '</td>';
    
        obj_row.empty().append(html);
        hideAddRowTable(model);
    }
    catch(err) {
        console.log("ERROR (saveRowTable) " + err.message);
    }
}

function editRowTable(model, plugin, row) {
    setValuesFieldsAddTable(model, row);
    showAddRowTable(model, plugin, row);
}

function deleteRowTable(model, plugin, row) {
    jConfirm('Esta por eliminar la fila '+row+' de la sección '+model+' ¿Desea continuar?', 'Mensaje de Confirmación', 
        function(r) {
            if (r) {
                var tr = $("tr[id='table_row["+model+"]["+row+"]']");
                tr.hide(200);
                if (getRowDo(model, row) == "A") {
                    tr.remove();
                }
                else {
                    tr.find("input[id*='[do]']").val("D");
                }  
            }
        });
}

function unDeleteRowTable(model, plugin, row) {
    var tr = $("tr[id='table_row["+model+"]["+row+"]']");
    tr.show(200);
    tr.find("input[id*='[do]']").val("X");
}

function resetFieldsAddTable(model) {
    $("[id^='table_add["+model+"]']").val("");
}

function setValuesFieldsAddTable(model, row) {
    var fields = $("[id^='table["+model+"]["+row+"]']");
    fields.each(function() {
        var id = this.id.replace("["+row+"]", "").replace("table", "table_add");
        $("[id='"+id+"']").val(this.value);
    });
}

function getRowDo(model, row) {
    return $("tr[id='table_row["+model+"]["+row+"]'] input[id*='[do]']").val();
}

function PKadded(model, pk) {
    var ret = 0;
    $("table[id='table["+model+"]'] [id$='[pk]']").each(function() {
        if (this.value == pk) {
            var row = $.trim($(this).parent().text());
            var op = $(this).siblings("[id$='[do]']").val();
            if (op == "D") {
                unDeleteRowTable(model, '', row);
                ret = 2;
            }
            else {
                ret = 1;
            }
        }
    });
    return ret;
}

function changeTablePage(model, action) {    
    if (typeof table_page[model] == "undefined") {
        table_page[model] = 1;
    }
    
    $("table[id='table["+model+"]'] tbody tr").hide();

    if (action == "back" && table_page[model] > 1) {
        $("#next_page").show();
        table_page[model]--;
        
        for (var i=(table_page[model]-1)*5; i<=table_page[model]*5-1; i++) {
            $("table[id='table["+model+"]'] tbody tr:eq("+i+")").show();
        }
        
        if (table_page[model] == 1) {
            $("#previous_page").hide();
        }
    }
    
    if (action == "forward") {
        $("#previous_page").show();
        table_page[model]++;
        
        cant = 0;
        for (var i=(table_page[model]-1)*5; i<=table_page[model]*5-1; i++) {
            if ($("table[id='table["+model+"]'] tbody tr:eq("+i+")").length) {
                $("table[id='table["+model+"]'] tbody tr:eq("+i+")").show();
                cant++;
            }
        }
        
        if (cant < 5) {
            $("#next_page").hide();
        }
    }
}